{% import "macros/user_name.html.j2" as USER_NAME %}

{#----------------------------------------------------------------------------#}
{#- Публичная секция: макросы для подключения в шаблонах представлений.      -#}
{#----------------------------------------------------------------------------#}

{#----------------------------------------------------------------------------#}
{# Подключаемые стили #}
{% macro STYLES() %}
  <link
      href="/static/css/bootstrap-select/bootstrap-select.css"
      rel="stylesheet"
      type="text/css" />
{% endmacro %}

{#----------------------------------------------------------------------------#}
{# Подключаемые скрипты #}
{% macro SCRIPTS() -%}
  <script src="/static/js/bootstrap-select/bootstrap-select.min.js"></script>
  <script src="/static/js/bootstrap-select/i18n/defaults-ru_RU.min.js"></script>
{%- endmacro %}

{#----------------------------------------------------------------------------#}
{# Поле ввода — выпадающий список для выбора одного значения.

  Аргументы
  ----------
  data_source : string
    Тип источника данных, которыми необходимо заполнить выпадающий список.
    Возможные значения:
    * 'users'
    * 'workflows_states'
    * 'workflows_issue_kinds'
    * 'projects_versions'
    * 'projects'
    * 'workflows'
    * 'target_workflow_states'
    * 'value_types'
    * 'field_kind_select'

  name : string
    Наименование поля в форме, также используется как идентификатор тега select.

  project_manager : ProjectManager
    Экземпляр для доступа к данным.

  selected_id : int
    Идентификатор выбранного элемента на момент создания выпадающего списка.

  need_zero_value : boolean
    Флаг, добавить ли в выпадающий список возможность выбора пустого значения.

  data_source_id : int
    Идентификатор источника данных, отталкиваясь от которого формируется
    итоговый выпадающий список. Применяетвы в:
    * 'target_workflow_states'
#}
{% macro INPUT_SINGLE(
    data_source,
    name,
    project_manager,
    selected_id=None,
    need_zero_value=True,
    data_source_id=None)
%}
  {% set selected_id = selected_id|string if selected_id else '' %}
  <select
      id="{{ name }}"
      name="{{ name }}"
      class="selectpicker show-tick form-control"
      data-live-search="true">

    {% if need_zero_value %}
      <option value="0" {% if not selected_id %}selected{% endif %}>—</option>
    {% endif %}

    {{ OPTIONS(data_source, project_manager, [selected_id], data_source_id) }}

  </select>
{% endmacro %}

{#----------------------------------------------------------------------------#}
{# Поле ввода — выпадающий список для выбора нескольких значений.

  Аргументы
  ----------
  data_source : string
    Тип источника данных, которыми необходимо заполнить выпадающий список.
    Возможные значения:
    * 'users'
    * 'workflows_states'
    * 'workflows_issue_kinds'
    * 'projects_versions'
    * 'projects'
    * 'workflows'
    * 'target_workflow_states'
    * 'value_types'
    * 'field_kind_select'

  name : string
    Наименование поля в форме, также используется как идентификатор тега select.

  project_manager : ProjectManager
    Экземпляр для доступа к данным.

  selected_ids : list<int>
    Список идентификаторов выбранных элементов на момент создания выпадающего
    списка.

  data_source_id : int
    Идентификатор источника данных, отталкиваясь от которого формируется
    итоговый выпадающий список. Применяется в:
    * 'users'
    * 'target_workflow_states'
#}
{% macro INPUT_MULTY(
    data_source,
    name,
    project_manager,
    selected_ids=[],
    data_source_id=None)
%}
  {% set ids = [] %}
  {% for id in selected_ids %}
    {% do ids.append(id|string) %}
  {% endfor %}

  <select
      id="{{ name }}"
      name="{{ name }}"
      class="selectpicker show-tick form-control"
      data-live-search="true"
      multiple>

    {# HACK : Нулевая опция нужна для применения изменений при снятии выбора
              на всех опциях. #}
    <option hidden selected value="0">—</option>

    {{ OPTIONS(data_source, project_manager, ids, data_source_id) }}

  </select>
{% endmacro %}



{#----------------------------------------------------------------------------#}
{#- Приватная секция: макросы для внутреннего использования.                 -#}
{#----------------------------------------------------------------------------#}

{#----------------------------------------------------------------------------#}
{# Выбирает подмакрос в зависимости от data_source. #}
{% macro OPTIONS(data_source, project_manager, selected, data_source_id) -%}
  {% if 'users' == data_source %}
    {{ USERS_OPTIONS(project_manager, selected, data_source_id) }}

  {% elif 'workflows_states' == data_source %}
    {{ WORKFLOWS_STATES_OPTIONS(project_manager, selected) }}

  {% elif 'workflows_issue_kinds' == data_source %}
    {{ WORKFLOWS_ISSUE_KINDS_OPTIONS(project_manager, selected) }}

  {% elif 'projects_versions' == data_source %}
    {{ PROJECTS_VERSIONS_OPTIONS(project_manager, selected) }}

  {% elif 'projects' == data_source %}
    {{ PROJECTS_OPTIONS(project_manager, selected) }}

  {% elif 'workflows' == data_source %}
    {{ WORKFLOWS_OPTIONS(project_manager, selected) }}

  {% elif 'target_workflow_states' == data_source %}
    {{ TARGET_WORKFLOW_STATES_OPTIONS(
        project_manager,
        selected,
        data_source_id)
    }}

  {% elif 'value_types' == data_source %}
    {{ VALUE_TYPES_OPTIONS(project_manager, selected, data_source_id) }}

  {% elif 'field_kind_select' == data_source %}
    {{ FIELD_KIND_SELECT_OPTIONS(project_manager, selected, data_source_id) }}

  {% endif %}
{% endmacro %}

{#----------------------------------------------------------------------------#}
{# Формирует перечень пользователей в формате 'Имя Фамилия (логин)'. #}
{% macro USERS_OPTIONS(project_manager, selected, data_source_id) %}
  {% for user in project_manager.ordered_users(data_source_id) %}
    <option
        value="{{ user.id }}"
        {% if user.id|string in selected %}selected{% endif %}>
      {{ USER_NAME.VALUE(user, data_source_id) }}
    </option>
  {% endfor %}
{% endmacro %}

{#----------------------------------------------------------------------------#}
{# Формирует перечень состояний в формате 'Рабочий процесс: состояние'. #}
{% macro WORKFLOWS_STATES_OPTIONS(project_manager, selected) %}
  {% for workflow in project_manager.workflows() %}
    {% for state in project_manager.ordered_states_by_workflow_id(workflow.id) %}
      <option
          value="{{ state.id }}"
          {% if state.id|string in selected %}selected{% endif %}>
        {{ workflow.caption|e }}: {{ state.caption|e }}
      </option>
    {% endfor %}
  {% endfor %}
{% endmacro %}

{#----------------------------------------------------------------------------#}
{# Формирует перечень типов запросов в формате 'Рабочий процесс: тип запроса' #}
{% macro WORKFLOWS_ISSUE_KINDS_OPTIONS(project_manager, selected) %}
  {% for workflow in project_manager.workflows() %}
    {% for issue_kind in project_manager.issue_kinds_by_workflow_id(workflow.id) %}
      <option
          value="{{ issue_kind.id }}"
          {% if issue_kind.id|string in selected %}selected{% endif %}>
        {{ workflow.caption|e }}: {{ issue_kind.caption|e }}
      </option>
    {% endfor %}
  {% endfor %}
{% endmacro %}

{#----------------------------------------------------------------------------#}
{# Формирует перечень версий в формате 'Проект: версия'. #}
{% macro PROJECTS_VERSIONS_OPTIONS(project_manager, selected) %}
  {% set projects = project_manager.projects() %}

  {# Открытые версии #}
    {% for project in projects %}
      {% set versions = project_manager.ordered_versions_by_project_id(project.id) %}
      {% for version in versions if version.is_pending_state() %}
        <option
            value="{{ version.id }}"
            {% if version.id|string in selected %}selected{% endif %}>
          {{ project.caption|e }}: {{ version.caption|e }}
        </option>
      {% endfor %}
    {% endfor %}
  {# /Открытые версии #}

  {# Закрытые версии #}
    {% for project in projects %}
      {% set versions = project_manager.ordered_versions_by_project_id(project.id) %}
      {% for version in versions if not version.is_pending_state() %}
        <option
            value="{{ version.id }}"
            {% if version.id|string in selected %}selected{% endif %}>
          {{ project.caption|e }}: {{ version.caption|e }} (выпущена)
        </option>
      {% endfor %}
    {% endfor %}
  {# /Закрытые версии #}
{% endmacro %}

{#----------------------------------------------------------------------------#}
{# Формирует перечень проектов. #}
{% macro PROJECTS_OPTIONS(project_manager, selected) %}
  {% for project in project_manager.projects() %}
    <option
        value="{{ project.id }}"
        {% if project.id|string in selected %}selected{% endif %}>
      {{ project.caption|e }}
    </option>
  {% endfor %}
{% endmacro %}

{#----------------------------------------------------------------------------#}
{# Формирует перечень рабочих процессов. #}
{% macro WORKFLOWS_OPTIONS(project_manager, selected) %}
  {% for workflow in project_manager.workflows() %}
    <option
        value="{{ workflow.id }}"
        {% if workflow.id|string in selected %}selected{% endif %}>
      {{ workflow.caption|e }}
    </option>
  {% endfor %}
{% endmacro %}

{#----------------------------------------------------------------------------#}
{# Формирует перечень состояний указанного рабочего процесса. #}
{% macro TARGET_WORKFLOW_STATES_OPTIONS(
    project_manager,
    selected,
    data_source_id)
%}
  {% set workflow = project_manager.workflow(data_source_id) %}
  {% if workflow %}
    {% for state in project_manager.ordered_states_by_workflow_id(workflow.id) %}
      <option
          value="{{ state.id }}"
          {% if state.id|string in selected %}selected{% endif %}>
        {{ workflow.caption|e }}: {{ state.caption|e }}
      </option>
    {% endfor %}
  {% endif %}
{% endmacro %}

{#----------------------------------------------------------------------------#}
{# Формирует перечень типов данных доступных для пользовательских полей. #}
{% macro VALUE_TYPES_OPTIONS(
    project_manager,
    selected,
    data_source_id)
%}
  {% for value_type in project_manager.value_types() %}
    <option
        value="{{ value_type|int }}"
        {% if value_type|int|string in selected %}selected{% endif %}>
      {% if value_type|int == 0 %}
        Строка
      {% elif value_type|int == 1 %}
        Текст в формате markdown
      {% elif value_type|int == 2 %}
        Целое число
      {% elif value_type|int == 3 %}
        Вещественное число
      {% elif value_type|int == 4 %}
        Флаг
      {% elif value_type|int == 5 %}
        Дата/время
      {% elif value_type|int == 6 %}
        Ссылка
      {% elif value_type|int == 50 %}
        Выпадающий список (единичный)
      {% elif value_type|int == 51 %}
        Выпадающий список (множественный)
      {% elif value_type|int == 100 %}
        Запрос
      {% elif value_type|int == 101 %}
        Пользователь
      {% elif value_type|int == 102 %}
        Проект
      {% elif value_type|int == 103 %}
        Версия
      {% elif value_type|int == 200 %}
        Перечень запросов
      {% elif value_type|int == 201 %}
        Перечень пользователей
      {% elif value_type|int == 202 %}
        Перечень проектов
      {% elif value_type|int == 203 %}
        Перечень версий
      {% else %}
        {{ value_type|string }}
      {% endif %}
    </option>
  {% endfor %}
{% endmacro %}

{#----------------------------------------------------------------------------#}
{# Формирует перечень значений для выбранного типа поля. #}
{% macro FIELD_KIND_SELECT_OPTIONS(
    project_manager,
    selected,
    data_source_id)
%}
  {% set field_kind = project_manager.field_kind(data_source_id) %}
  {% if field_kind %}
    {% for value in field_kind.get_values() %}
      <option
          value="{{ value }}"
          {% if selected is string %}
            {% if value == selected %}selected{% endif %}
          {% else %}
            {% if value in selected %}selected{% endif %}
          {% endif %}>
        {{ value|e }}
      </option>
    {% endfor %}
  {% endif %}
{% endmacro %}
